/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gestionedt.affectations;

import gestionedt.controllers.GroupeJpaController;
import gestionedt.controllers.ModuleJpaController;
import gestionedt.controllers.PrestationJpaController;
import gestionedt.models.Creneau;
import gestionedt.models.Groupe;
import gestionedt.models.Module;
import gestionedt.models.Prestation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

/**
 *
 */
public class AffectationsAction extends DispatchAction {

    /**
     * Affiche la liste des affectations de groupes pour chaque prestation
     * de chaque module.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward afficher(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        AffectationsForm aForm = (AffectationsForm) form;
        ModuleJpaController ctModule = new ModuleJpaController();
        List<Module> modules = ctModule.findModulesAvecRel();
        aForm.setModules(modules);

        GroupeJpaController ctGroupe = new GroupeJpaController();
        Map<Integer, List<Groupe>> groupesSansPrest = null;
        groupesSansPrest = new HashMap<Integer, List<Groupe>>(modules.size());
        for(Module module : modules)
            groupesSansPrest.put(module.getId(), ctGroupe.findGroupesSansPrest(module));
        aForm.setGroupesSansPrest(groupesSansPrest);

        return mapping.findForward("liste");
    }

    /**
     * Répond à une requête AJAX en retournant la liste des affections des
     * groupes aux prestations d'un module donné.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward mettreAJourModule(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        AffectationsForm aForm = (AffectationsForm) form;
        ModuleJpaController ctModule = new ModuleJpaController();
        Module module = ctModule.findModuleAvecRel(aForm.getIdModule());
        List<Module> modules = new ArrayList<Module>(1);
        modules.add(module);
        aForm.setModules(modules);

        GroupeJpaController ctGroupe = new GroupeJpaController();
        Map<Integer, List<Groupe>> groupesSansPrest = null;
        groupesSansPrest = new HashMap<Integer, List<Groupe>>(1);
        groupesSansPrest.put(module.getId(), ctGroupe.findGroupesSansPrest(module));
        aForm.setGroupesSansPrest(groupesSansPrest);

        return mapping.findForward("majmodule");
    }

    /**
     * Inscrit un groupe à une prestation donnée.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward affecterGrp(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        AffectationsForm aForm = (AffectationsForm) form;

        PrestationJpaController ctPrest = new PrestationJpaController();
        Prestation prestation = ctPrest.findPrestationAvecRel(aForm.getIdPrestation());

        GroupeJpaController ctGroupe = new GroupeJpaController();
        Groupe groupe = ctGroupe.findGroupeAvecRel(aForm.getIdGroupe());

        List<String> msg = new ArrayList<String>();
        // si la prestation est déjà casée sur l'emploi du temps,
        if(prestation.getCreneau() != null) {
            Creneau creneau = prestation.getCreneau();
            // il faut vérifier qu'il n'y a pas de conflit si on inscrit le groupe :
            // - vérification des disponibilités du groupe :
            if(groupe.estIndispo(creneau))
                msg.add("Le groupe '" + groupe + "' n'est pas " +
                         "disponible le " + creneau + ".");
            // - vérification que le groupe ne suit pas déjà une prestation durant ce créneau
            if(groupe.suitPrestationLe(creneau))
                msg.add("Le groupe '" + groupe + "' suit déjà " +
                        "une prestation le " + creneau + ".");
        }
        // on vérifie aussi que l'effectif max de la prestation n'est pas dépassé :
        int effectifMax = prestation.getModule().getEffectifMax();
        if(effectifMax < (prestation.getEffectif() + groupe.getEffectif()))
            msg.add("Si le groupe '" + groupe + "' est affecté à la " +
                    "prestation l'effectif maximal sera dépassé.");

        if(msg.size() > 0) { // s'il y a des conflits
            aForm.setConflits(msg);
        }
        // s'il n'y a pas de conflit que le groupe n'est pas déjà inscrit
        else if( ! prestation.getGroupes().contains(groupe)) {
            // le groupe est affecté à la prestation
            prestation.getGroupes().add(groupe);
            ctPrest.edit(prestation);
        }

        return this.mettreAJourModule(mapping, form, request, response);
    }

    /**
     * Désinscrit un groupe d'une prestation donnée.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward enleverGrp(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        AffectationsForm aForm = (AffectationsForm) form;

        PrestationJpaController ctPrest = new PrestationJpaController();
        Prestation prestation = ctPrest.findPrestationAvecRel(aForm.getIdPrestation());

        GroupeJpaController ctGroupe = new GroupeJpaController();
        Groupe groupe = ctGroupe.findGroupe(aForm.getIdGroupe());

        prestation.getGroupes().remove(groupe);
        ctPrest.edit(prestation);

        return this.mettreAJourModule(mapping, form, request, response);
    }
    
}
